/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __4C754A73_6848_4938_AEBF_FC9511283512__
#define __4C754A73_6848_4938_AEBF_FC9511283512__

namespace xos_json
{

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // json接口
    // 
    class i_json : public xos::i_release
    {
    protected:
        virtual ~i_json(){}

    public:
        // 
        // 读取json值
        // 
        virtual const char * get_str( const char * lpszKey, char * lpszData, int nLen, int * pnLenNeeded ) = 0;

        // 
        // 读取json的key和value值
        // 
        virtual const char * get_key( char * lpszKey, int nLen, bool bIsFirst ) = 0;

        // 
        // 读取json值
        // 
        virtual i_json * get_json( const char * lpszKey, i_json ** ppv ) = 0;

        // 
        // 读取json double值
        // 
        virtual double get_double( const char * lpszKey, double * pdValue ) = 0;

        // 
        // 读取json值
        // 
        virtual int get_int( const char * lpszKey, int * pnValue ) = 0;

        // 
        // 设置json值
        // 
        virtual int set_str( const char * lpszKey, const char * lpszStr ) = 0;

        // 
        // 设置json值,设置之后,pv与主对象是独立的
        // 
        virtual int set_json( const char * lpszKey, i_json * pv ) = 0;

        // 
        // 设置json值
        // 
        virtual int set_double( const char * lpszKey, double dlData ) = 0;

        // 
        // 设置json值
        // 
        virtual int set_int( const char * lpszKey, int nData ) = 0;

        // 
        // 读取数组值
        // 
        virtual i_json * get_array_item( int nIndex, i_json ** ppv ) = 0;

        // 
        // 向数组添加无素,添加数组字串元素
        // 
        virtual int append_str( const char * lpszStr ) = 0;

        // 
        // 向数组添加无素
        // 
        virtual int append_double( double dlData ) = 0;

        // 
        // 向数组添加无素,添加数组整数元素
        // 
        virtual int append_int( int nData ) = 0;

        // 
        // 向数组添加无素,添加时是复制操作
        // 
        virtual int append_array( i_json * pv ) = 0;

        // 
        // 返回数组长度
        // 
        virtual int get_array_size() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // json管理接口
    // 
    class i_json_mgr : public xos::i_release
    {
    protected:
        virtual ~i_json_mgr(){}

    public:
        // 
        // xos_box::i_str_property -> i_json
        // 
        virtual int prop_to_json( xos_box::i_str_property * pProperty, char * lpszJson, int nSize, int * pnLenRet ) = 0;
        virtual int prop_to_json( xos_box::i_str_property * pProperty, i_json ** ppv ) = 0;

        // 
        // pack to string
        // 
        virtual int pack( i_json * pv, char * lpszStr, int nLen, int * pnLenRet ) = 0;

        // 
        // parse
        // 
        virtual int parse( const char * lpszStr, int nLen, i_json ** ppv ) = 0;

        // 
        // create i_json
        // 
        virtual i_json* json() = 0;
    };

    /////////////////////////////////////////////////////////////////////////////////
    // 
    // export function
    // 
    typedef int ( * f_create )( xos_container::i_container * pContainer, i_json_mgr ** ppv );

} // xos_json

#endif // __4C754A73_6848_4938_AEBF_FC9511283512__
